﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Text;
using SIGEB.Modelo.moduloTipoDocumentos;
using Npgsql;
using System.Data;
using SIGEB.Modelo.moduloEditorial;

namespace SIGEB.Modelo.moduloDocumentos
{
    public class conjuntoDocumentos:conjuntoBase
    {   
        #region "constructor"

        public conjuntoDocumentos(datosAplicacion dA)
            : base(dA)
        {
            numTipo = conjuntoBase.CONJDOCUMENTOS;
        }

        #endregion

        #region "metodos"

        public override object obtenerEstado()
        {
            throw new NotImplementedException();
        }

        #region "imec"

        public void agregarDocumento(documento nuevoDoc)
        {
            string nuevoid = "";
            try
            {
                compConexion.Open();
                string sql = "SELECT * from registrar_documento('" + nuevoDoc.codDocumento + "', '" + nuevoDoc.titulo + "', " + nuevoDoc.docVirtual + ", '" + nuevoDoc.descriptores + "', '" + nuevoDoc.clasificacion
                    + "', '" + nuevoDoc.serie + "', " + nuevoDoc.totales + ", " + nuevoDoc.solicitados + ", " + nuevoDoc.prestados + ", '" +
                    nuevoDoc.atributos.codTipoDocumento + "', '" + nuevoDoc.editorialD.nombre + "', '" + nuevoDoc.autorD.nombre + "') as (idDocumento varchar(20))";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 1);
                    nuevoid = valores[0];
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al agregar documento: " + nuevoDoc.codDocumento);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            foreach (valor act in nuevoDoc.valores)
            {
                datos.valores.agregarvalor(nuevoid, act);
            }
            notificar(this.numTipo, null);
        }

        public void eliminarDocumento(String codDocumento)
        {
            try
            {
                compConexion.Open();
                string sql = "SELECT eliminar_documento('" + codDocumento + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            notificar(this.numTipo, null);
        }

        public void modificarDocumento(String codDocumento, documento nuevoDoc)
        {
            try
            {
                compConexion.Open();
                string sql = "SELECT * from actualizar_documento('" + codDocumento + "', '" + nuevoDoc.titulo + "', " + nuevoDoc.docVirtual + ", '" + nuevoDoc.descriptores + "', '" + nuevoDoc.clasificacion
                    + "', '" + nuevoDoc.serie + "', " + nuevoDoc.totales + ", " + nuevoDoc.solicitados + ", " + nuevoDoc.prestados + ", '" +
                    nuevoDoc.atributos.codTipoDocumento + "', '" + nuevoDoc.editorialD.nombre + "', '" + nuevoDoc.autorD.nombre + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            foreach (valor act in nuevoDoc.valores)
            {
                if (datos.valores.obtenervalor(codDocumento, act.idAtributo) != null)
                {
                    datos.valores.modificarvalor(codDocumento, act.idAtributo, act);
                }
                else
                {
                    datos.valores.agregarvalor(codDocumento, act);
                }
            }
            notificar(this.numTipo, null);
        }

        public documento obtenerDocumento(String codDocumento)
        {
            documento nuevo = null;
            string idTipoDoc = "";
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_documento_id('" + codDocumento + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 12);
                    nuevo = new documento(valores[0], valores[1], bool.Parse(valores[2]), valores[3], valores[4], valores[5], int.Parse(valores[6]),
                        int.Parse(valores[7]), int.Parse(valores[8]), new autor(valores[11]), new editorial(valores[10]), null, null);
                    idTipoDoc = valores[9];
                }
            }
            catch(Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener el documento " + codDocumento);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            if (nuevo != null && !string.IsNullOrEmpty(idTipoDoc))
            {
                nuevo.atributos = datos.tiposDocumentos.obtenertipoDocumento(idTipoDoc);
                nuevo.valores = datos.valores.obtenerByDocId(nuevo.codDocumento);
            }
            return nuevo;
        }

        public LinkedList<documento> obtenerTodos()
        {
            LinkedList<documento> nuevo = new LinkedList<documento>();
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_documento()";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 12);
                    documento n = new documento(valores[0], valores[1], bool.Parse(valores[2]), valores[3], valores[4], valores[5], int.Parse(valores[6]),
                        int.Parse(valores[7]), int.Parse(valores[8]), new autor(valores[11]), new editorial(valores[10]), null, null);
                    n.idTipoDocumento = valores[9];
                    nuevo.AddLast(n);
                    
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener todo los documentos");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            foreach (documento act in nuevo)
            {
                act.atributos = datos.tiposDocumentos.obtenertipoDocumento(act.idTipoDocumento);
                act.valores = datos.valores.obtenerByDocId(act.codDocumento);
            }
            return nuevo;
        }

        public documento obtenerXCodigoDocumento(String codDocumento)
        {
            documento nuevo = null;
            string idTipoDoc = "";
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_documento_id_modulo('" + codDocumento + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 12);
                    nuevo = new documento(valores[0], valores[1], bool.Parse(valores[2]), valores[3], valores[4], valores[5], int.Parse(valores[6]),
                        int.Parse(valores[7]), int.Parse(valores[8]), new autor(valores[11]), new editorial(valores[10]), null, null);
                    idTipoDoc = valores[9];
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener el documento " + codDocumento);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            if (nuevo != null && !string.IsNullOrEmpty(idTipoDoc))
            {
                nuevo.atributos = datos.tiposDocumentos.obtenertipoDocumento(idTipoDoc);
                nuevo.valores = datos.valores.obtenerByDocId(nuevo.codDocumento);
            }
            return nuevo;
        }

        public LinkedList<documento> obtenerXautor(string autor)
        {
            LinkedList<documento> nuevo = new LinkedList<documento>();
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_documento_autor_modulo('" + autor + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 12);
                    documento n = new documento(valores[0], valores[1], bool.Parse(valores[2]), valores[3], valores[4], valores[5], int.Parse(valores[6]),
                        int.Parse(valores[7]), int.Parse(valores[8]), new autor(valores[11]), new editorial(valores[10]), null, null);
                    n.idTipoDocumento = valores[9];
                    nuevo.AddLast(n);

                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener todo los documentos");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            foreach (documento act in nuevo)
            {
                act.atributos = datos.tiposDocumentos.obtenertipoDocumento(act.idTipoDocumento);
                act.valores = datos.valores.obtenerByDocId(act.codDocumento);
            }
            return nuevo;
        }

        public LinkedList<documento> obtenerXtitulo(string titulo)
        {
            LinkedList<documento> nuevo = new LinkedList<documento>();
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_documento_titulo_modulo('" + titulo + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;

                if (dt.Rows != null && dt.Rows.Count > 0)
                {
                    foreach (DataRow row in dt.Rows)
                    {
                        valores = datosDataSet(row, 12);
                        documento n = new documento(valores[0], valores[1], bool.Parse(valores[2]), valores[3], valores[4], valores[5], int.Parse(valores[6]), int.Parse(valores[7]), int.Parse(valores[8]), new autor(valores[11]), new editorial(valores[10]), null, null);
                        n.idTipoDocumento = valores[9];
                        nuevo.AddLast(n);
                    }
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener todo los documentos");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            if(nuevo != null && nuevo.Count > 0)
            {
                foreach (documento act in nuevo)
                {
                    act.atributos = datos.tiposDocumentos.obtenertipoDocumento(act.idTipoDocumento);
                    act.valores = datos.valores.obtenerByDocId(act.codDocumento);
                }
            }
            return nuevo;
        }

        public LinkedList<documento> busquedaLibre(string texto)
        {
            LinkedList<documento> nuevo = new LinkedList<documento>();
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM busqueda_documentos('" + texto + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 12);
                    documento n = new documento(valores[0], valores[1], bool.Parse(valores[2]), valores[3], valores[4], valores[5], int.Parse(valores[6]),
                        int.Parse(valores[7]), int.Parse(valores[8]), new autor(valores[11]), new editorial(valores[10]), null, null);
                    n.idTipoDocumento = valores[9];
                    nuevo.AddLast(n);

                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message + "\nError al obtener todo los documentos");
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            foreach (documento act in nuevo)
            {
                act.atributos = datos.tiposDocumentos.obtenertipoDocumento(act.idTipoDocumento);
                act.valores = datos.valores.obtenerByDocId(act.codDocumento);
            }
            return nuevo;
        }

        public documento documentXEjemplar(string idEjemplar)
        {
            documento nuevo = null;
            string idTipoDoc = "";
            try
            {
                compConexion.Open();
                string sql = "SELECT * FROM consultar_documento_idEjemplar('" + idEjemplar + "')";
                NpgsqlDataAdapter da = new NpgsqlDataAdapter(sql, compConexion);
                // i always reset DataSet before i do something with it.... i don't know why :-)
                ds.Reset();
                // filling DataSet with result from NpgsqlDataAdapter
                da.Fill(ds);
                // since it C# DataSet can handle multiple tables, we will select first
                dt = ds.Tables[0];
                string[] valores;
                foreach (DataRow row in dt.Rows)
                {
                    valores = datosDataSet(row, 12);
                    nuevo = new documento(valores[0], valores[1], bool.Parse(valores[2]), valores[3], valores[4], valores[5], int.Parse(valores[6]),
                        int.Parse(valores[7]), int.Parse(valores[8]), new autor(valores[11]), new editorial(valores[10]), null, null);
                    idTipoDoc = valores[9];
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
            finally
            {
                try
                {
                    compConexion.Close();
                }
                catch { }
            }
            return nuevo;
        }
  
        #endregion

        #endregion
    }
}
